This demo is an entirely automated report – all charts and tables, as well as all figures within the text have been generated from the data, with no manual input. This report makes use of the outputs generated by 5W_cleaning.Rmd, which automates the cleaning of 5W data. The 5W data used has had partner information removed.

 

1 Summary of beneficiaries by activity, with sex ratio

actividad total percent_of_total male female sex_ratio
DISTRIBUCION DE KITS DE MATERIALES ESCOLARES 471,568 50.88 232,197 239,372 0.97
ALIMENTACION ESCOLAR 156,926 16.93 72,139 84,787 0.85
EDUCACION A DISTANCIA 132,258 14.27 64,240 68,018 0.94
APOYO PSICOEDUCATIVO PARA NNA 120,887 13.04 54,859 66,028 0.83
FORMACION DOCENTE Y OTRO PERSONAL EDUCATIVO 17,238 1.86 3,470 13,224 0.26
ACTIVIDADES CON ADOLESCENTES Y JOVENES DE NIVELACION, HABILIDADES PARA LA VIDA Y CAPACITACION TECNICA 14,016 1.51 6,336 7,680 0.82
BECAS Y OTROS INCENTIVOS PARA DOCENTES Y PERSONAL 5,744 0.62 1,572 4,172 0.38
ACTIVIDADES RECREATIVAS 4,317 0.47 1,998 2,319 0.86
INICIATIVAS PARA REINSERCION EDUCATIVA DE NNA FUERA DE LA ESCUELA 3,869 0.42 2,114 1,755 1.2

A total of 728,408 individuals have been reached to date. In terms of frequencies (inclusive of double counting), 926,823 have been reached.

Additionally, the 4,746,671 beneficiary frequencies reached by the activity PROMOCION MENSAJES CLAVES PARA LA COMUNIDAD ESCOLAR have been removed from the totals in this report as the activity consists of solely radio messaging.

   

2 Beneficiaries by age

unique beneficiaries or individuals

 

2.1 Beneficiaries by age compared to 2017 Enrolment

With reference to the 2017 Matricula dataset, we can see that the Education programme has reached an overall average of 9% of schoolgoing children aged 3-17 nationwide. Children aged 3-17 consitute 88% of all UNICEF beneficiaries.

Edad grupo beneficiarios matricula2017 percent_total
3-6 121,169 1,438,475 8.423
7-12 352,808 3,252,505 10.85
12-17 169,771 2,205,724 7.697

   

3 Changes since previous month

The number of individuals reached has increased by 175,005 in the past month, reaching a total of 728,408. The number of beneficiary frequencies reached has increased by 218,443 in the same period, reaching a total of 926,823.

 

3.1 Progress by activity by month

mouse over to see details

Progress in recent months has largely been due to the distribution of education kits and distance learning.

   

4 Summaries by geography

4.1 Beneficiaries by state

 

4.2 Number of Schools by State

A total of 2,229 schools have been reached by UNICEF; 44% are from Miranda and Zulia alone.

 

4.3 Scatterplot of Municipalities

logarithmic scale; larger points indicate more beneficiaries reached, darker blues indicate more activity types

mouse over municipalities to see beneficiaries and distinct activities

A total of 110 municipalities were reached by the UNICEF Education programme.

 

4.4 Top 10 municipalities by reach and coverage

by beneficiaries
estado municipio beneficiarios
DISTRITO CAPITAL LIBERTADOR 80482
MIRANDA SUCRE 59176
ZULIA MARACAIBO 55370
BOLIVAR CARONI 37908
ZULIA SAN FRANCISCO 29369
AMAZONAS ATURES 22430
LARA IRIBARREN 21977
BOLIVAR HERES 18293
DELTA AMACURO TUCUPITA 17953
BOLIVAR CEDENO 15681
by coverage
estado municipio coverage_percent
TACHIRA FERNANDEZ FEO 87
TACHIRA AYACUCHO 79
ZULIA MACHIQUES DE PERIJA 79
AMAZONAS AUTONOMO AUTANA 76
TACHIRA SAMUEL DARIO MALDONADO 75
TACHIRA PANAMERICANO 72
MIRANDA PLAZA 68
TACHIRA INDEPENDENCIA 68
TACHIRA JUNIN 65
MIRANDA EL HATILLO 64

Together, the 10 municipalities with the highest reach (above left) form 49% of the 728,400 beneficiaries reached. The average coverage of the school-age population in the municipalities where UNICEF is present is 20%. Coverage refers to the percentage of enrolled children (aged 3-17 years) reached by UNICEF.

 

4.5 Histogram of Coverage

Below is a histogram of munciipalities where UNICEF is present showing the coverage of enrolled children (aged 3-17). Of note, we have reached 10% or less of the population in 55 out of the 110 in which we operate. This is in addition to the 226 where no UNICEF Education activities have occurred.

   

5 Reports about Partners

5.1 Summary by Partner

 

5.2 Number of different activities implemented by each partner

partner SOCIO 2 SOCIO 1 SOCIO 4 SOCIO 5 UNICEF SOCIO 3 SOCIO 6 SOCIO 7 SOCIO 10 SOCIO 8
num_activities 9 8 8 6 6 4 2 2 1 1

 

5.3 Partners’ progress over time

mouse over for details

 

5.4 Summary table about partners’ achievements

organizacion_implementadora beneficiarios percent_of_total male female sex_ratio municipalities
UNICEF 353,944 38.19 168,281 185,664 0.91 74
SOCIO 1 160,260 17.29 79,958 80,302 1 92
SOCIO 2 146,451 15.8 65,494 80,957 0.81 51
SOCIO 5 113,845 12.28 50,511 63,334 0.8 10
SOCIO 4 86,074 9.29 42,534 43,540 0.98 17
SOCIO 7 31,322 3.38 14,750 16,572 0.89 10
SOCIO 8 29,471 3.18 15,379 14,092 1.09 17
SOCIO 10 2,461 0.27 1,151 1,310 0.88 1
SOCIO 3 2,423 0.26 862 1,561 0.55 3
SOCIO 6 572 0.06 5 23 0.22 7

   

6 Maps and reference table

 

6.1 Maps at municipal level

   

6.2 Reference table - municipal level

use UNICEF_present to filter to municipalities where the Education programme operates

CA01.05 Promocion de mensajes claves para la comunidad escolar is not included

LS0tDQp0aXRsZTogIlJlcG9ydCBvbiBFZHVjYXRpb24gNVcgZGF0YSAtLSBWZW5lenVlbGEiDQphdXRob3I6ICJTZWFuIE5nIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9JyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSAxMCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShtYXB0b29scykNCmxpYnJhcnkoZ2dmb3JjZSkNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRpbnl0ZXgpDQpsaWJyYXJ5KHdlYnNob3QpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIE1BS0UgU1VSRSBZT1UgUkVBRCBJTiBUSEUgUklHSFQgRklMRSAtLSBDSEVDSyBUSU1FU1RBTVANCmFjdF9iZW4gPC0gcmVhZF9jc3YoIjIxMTEwOF8wMTEzX2FjdF9iZW4uY3N2IikgDQp1X2JlbiA8LSByZWFkX2NzdigiMjExMTA4XzAxMTNfdV9iZW4uY3N2IikgDQoNCiMgc3VtKGFjdF9iZW4kYmVuZWZpY2lhcmlvcykNCiMgc3VtKHVfYmVuJGJlbmVmaWNpYXJpb3MpDQoNCiMgY2Vuc3VzIHJlZmVyZW5jZSBkYXRhc2V0cw0KY2VuX3JlZiA8LSByZWFkX2V4Y2VsKCJjZW5zdXNfZGF0YV8yMDE5MTEyMi54bHN4Iiwgc2hlZXQgPSAiZGF0YSIpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgc2VsZWN0KGVzdGFkbywgcGNvZGUxLCBtdW5pY2lwaW8sIHBjb2RlMiwgcGFycm9xdWlhLCBwY29kZTMsIGZpZWxkX29mZmljZSwNCiAgICAgICAgIHBvYmxhY2lvbl90b3RhbF8yMDExLCB4XzIwMTlfcG9ibGFjaW9uX3BhcnJvcXVpYWxfdG90YWwsDQogICAgICAgICBoYW1fMjAxOV9hbWJpdG9zX2dlLCBoYW1fMjAxOV94eF9wb2JyZXphX2Vudl9wb3JfcGFycm9xdWlhLCANCiAgICAgICAgIGhhbV8yMDE5X3h4X3BvYmxhY2lvbl9wb2JyZV9wb3JfcGFycm9xdWlhLA0KICAgICAgICAgcG9ibGFjaW9uX2luZmFudGlsX21lbm9yX2RlXzEyX2Fub3MsIHBvYmxhY2lvbl9hZG9sZXNjZW50ZXNfZGVfMTJfYV8xN19hbm9zLA0KICAgICAgICAgcG9ibGFjaW9uX2RlXzE4X2Fub3NfeV9tYXMsIA0KICAgICAgICAgcG9ibGFjaW9uX3VyYmFuYV9wZXJjZW50LCBhcmVhX2ttMiwgZGVuc2lkYWRfcG9ibGFjaW9uYWxfcHBsX2ttMiwNCiAgICAgICAgIG1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9pbmljaWFsLCBtYXRyaWN1bGFfMjAxN19lZHVjYWNpb25fcHJpbWFyaWEsIA0KICAgICAgICAgbWF0cmljdWxhXzIwMTdfZWR1Y2FjaW9uX21lZGlhKQ0KDQojIGZpbHRlcmluZyBvdXQgUFJPTU9DSU9OIE1FTlNBSkVTIENMQVZFUyBQQVJBIExBIENPTVVOSURBRCBFU0NPTEFSDQpDQTEwNSA8LSBhY3RfYmVuICU+JSBmaWx0ZXIoYWN0aXZpZGFkX2NvZGlnbyA9PSAiQ0ExLjA1IikNCg0KIyBjcmVhdGluZyBkYXRhc2V0cyB3aXRob3V0IENBMS4wNSBhbmQNCiMgZm9yIGFjdF9iZW4sIHJlY29kaW5nIFVOSUNFRiBhbmQgbXV0YXRpbmcgc2hvcnQgYWN0aXZpdHkgZGVzY3JpcHRpb25zDQphY3RfYmVuMiA8LSBhY3RfYmVuICU+JSANCiAgZmlsdGVyKGFjdGl2aWRhZF9jb2RpZ28gIT0gIkNBMS4wNSIpICU+JSANCiAgbXV0YXRlKG9yZ2FuaXphY2lvbl9pbXBsZW1lbnRhZG9yYSA9IA0KICAgICAgICAgICBzdHJfcmVwbGFjZV9hbGwob3JnYW5pemFjaW9uX2ltcGxlbWVudGFkb3JhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklDRUYgLSBGb25kbyBkZSBsYXMgTmFjaW9uZXMgVW5pZGFzIHBhcmEgbGEgSW5mYW5jaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOSUNFRiIpKSAlPiUgDQogIG11dGF0ZShhY3RpdmlkYWRfc2hvcnQgPSByZWNvZGUoYWN0aXZpZGFkX2NvZGlnbywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBMS4wMSA9ICIxLjAxX3JlaW5zZXJjaW9uIGVkdWNhdGl2YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBMS4wMiA9ICIxLjAyX25pdmVsYWNpb24geSBjYXBhY2l0YWNpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTEuMDMgPSAiMS4wM19raXRzIGVzY29sYXJlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBMS4wNCA9ICIxLjA0X2FsaW1lbnRhY2lvbiBlc2NvbGFyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ExLjA1ID0gIjEuMDVfcHJvbW9jaW9uIG1lbnNhamVzIGNsYXZlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBMS4wNiA9ICIxLjA2X2Fwb3lvIHBzaWNvZWR1Y2F0aXZvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ExLjA3ID0gIjEuMDdfYWN0aXZpZGFkZXMgcmVjcmVhdGl2YXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTIuMDggPSAiMi4wOF9lZHVjYWNpb24gYSBkaXN0YW5jaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTIuMDkgPSAiMi4wOV9mb3JtYWNpb24gZG9jZW50ZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTIuMTAgPSAiMi4xMF9iZWNhcyBkb2NlbnRlcyIpKQ0KICAgICAgICAgICAgICAgICAgICANCnVfYmVuMiA8LSB1X2JlbiAlPiUgZmlsdGVyKCFzdHJfZGV0ZWN0KC4kdWJpY2FjaW9uLCAiXlJBRElPIikpDQoNCg0KDQpgYGANCg0KJm5ic3A7DQombmJzcDsNCg0KPiBUaGlzIGRlbW8gaXMgYW4gZW50aXJlbHkgYXV0b21hdGVkIHJlcG9ydCAtLSBhbGwgY2hhcnRzIGFuZCB0YWJsZXMsIGFzIHdlbGwgYXMgYWxsIGZpZ3VyZXMgd2l0aGluIHRoZSB0ZXh0IGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSB0aGUgZGF0YSwgd2l0aCBubyBtYW51YWwgaW5wdXQuIFRoaXMgcmVwb3J0IG1ha2VzIHVzZSBvZiB0aGUgb3V0cHV0cyBnZW5lcmF0ZWQgYnkgYDVXX2NsZWFuaW5nLlJtZGAsIHdoaWNoIGF1dG9tYXRlcyB0aGUgY2xlYW5pbmcgb2YgNVcgZGF0YS4gVGhlIDVXIGRhdGEgdXNlZCBoYXMgaGFkIHBhcnRuZXIgaW5mb3JtYXRpb24gcmVtb3ZlZC4gDQoNCiZuYnNwOyANCg0KIyBTdW1tYXJ5IG9mIGJlbmVmaWNpYXJpZXMgYnkgYWN0aXZpdHksIHdpdGggc2V4IHJhdGlvIA0KDQpgYGB7ciwgc3VtbWFyeSBUQUJMRSAtLSBhY3Rpdml0eSBhbmQgc2V4fQ0KDQojIGFzIGEgbm90ZSwgaSBkb24ndCB0aGluayB5b3UgY2FuIHB1dCBhbiBzdHJfZGV0ZWN0IGluc2lkZSBhIHN1bW1hcmlzZQ0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCnN1bW1hcnlfYWN0IDwtIGFjdF9iZW4yICU+JSANCiAgbXV0YXRlKHNleF9iZW4gPSBpZmVsc2Uoc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCAiXm0iKSwgIm1hbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCAiXmYiKSwgImZlbWFsZSIsICJub19lc3AiKSkpICU+JSANCiAgbXV0YXRlKGFjdGl2aWRhZCA9IGFjdGl2aWRhZF9kZXNjKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0oYmVuZWZpY2lhcmlvcywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG1hbGUgPSBzdW0oKGJlbmVmaWNpYXJpb3Nbc2V4X2JlbiA9PSAibWFsZSJdKSksDQogICAgICAgICAgICBmZW1hbGUgPSBzdW0oKGJlbmVmaWNpYXJpb3Nbc2V4X2JlbiA9PSAiZmVtYWxlIl0pKSwNCiAgICAgICAgICAgIHNleF9yYXRpbyA9IHJvdW5kKChtYWxlL2ZlbWFsZSksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50X29mX3RvdGFsID0gcm91bmQoKHRvdGFsIC8gc3VtKHRvdGFsKSAqIDEwMCksIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbG9jYXRlKHBlcmNlbnRfb2ZfdG90YWwsIC5hZnRlciA9IHRvdGFsKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpDQoNCnBhbmRlcihzdW1tYXJ5X2FjdCwgYmlnLm1hcmsgPSAiLCIsIHN0eWxlID0gInJtYXJrZG93biIpDQoNCg0KYGBgDQoNCg0KDQo+IEEgdG90YWwgb2YgX19gciBmb3JtYXQocm91bmQoc3VtKHVfYmVuMiRiZW5lZmljaWFyaW9zKSksIGJpZy5tYXJrID0gIiwiKWBfXyBpbmRpdmlkdWFscyBoYXZlIGJlZW4gcmVhY2hlZCB0byBkYXRlLiBJbiB0ZXJtcyBvZiBmcmVxdWVuY2llcyAoaW5jbHVzaXZlIG9mIGRvdWJsZSBjb3VudGluZyksIF9fYHIgZm9ybWF0KHN1bShhY3RfYmVuMiRiZW5lZmljaWFyaW9zKSwgYmlnLm1hcmsgPSAiLCIpYF9fIGhhdmUgYmVlbiByZWFjaGVkLiANCg0KPiBBZGRpdGlvbmFsbHksIHRoZSBfX2ByIGZvcm1hdChzdW0oQ0ExMDUkYmVuZWZpY2lhcmlvcyksIGJpZy5tYXJrID0gIiwiKWBfXyBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWFjaGVkIGJ5IHRoZSBhY3Rpdml0eSBQUk9NT0NJT04gTUVOU0FKRVMgQ0xBVkVTIFBBUkEgTEEgQ09NVU5JREFEIEVTQ09MQVIgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdG90YWxzIGluIHRoaXMgcmVwb3J0IGFzIHRoZSBhY3Rpdml0eSBjb25zaXN0cyBvZiBzb2xlbHkgcmFkaW8gbWVzc2FnaW5nLiANCg0KJm5ic3A7DQombmJzcDsNCg0KIyBCZW5lZmljaWFyaWVzIGJ5IGFnZQ0KKnVuaXF1ZSBiZW5lZmljaWFyaWVzIG9yIGluZGl2aWR1YWxzKg0KDQpgYGB7ciwgYmVuZWZpY2lhcmllcyBieSBhZ2UgUExPVH0NCm9yZHZlYyA8LSBjKCIwLTMiLCAiMy02IiwgIjctMTIiLCAiMTItMTciLCAiMTgtMTkiLCAibWF5b3JfcXVlXzE5IikNCg0KYWdlX3VfYmVuIDwtIHVfYmVuMiAlPiUgIyBpbXBvcnRhbnQgdG8gdXNlIHVfYmVuIGhlcmUgDQogIG11dGF0ZShhZ2VfYmVuID0gY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoZGVzYWdyZWdhY2lvbiwiMF8zJCIpIH4gIjAtMyIsDQogICAgc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCIzXzYkIikgfiAiMy02IiwNCiAgICBzdHJfZGV0ZWN0KGRlc2FncmVnYWNpb24sICI3XzEyJCIpIH4gIjctMTIiLCANCiAgICBzdHJfZGV0ZWN0KGRlc2FncmVnYWNpb24sICIxMl8xNyQiKSB+ICIxMi0xNyIsDQogICAgc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCAiMThfMTkkIikgfiAiMTgtMTkiLA0KICAgIHN0cl9kZXRlY3QoZGVzYWdyZWdhY2lvbiwgIm1heW9yZXNfZGVfMTkkIikgfiAibWF5b3JfcXVlXzE5IiwgDQogICAgVFJVRSB+ICJub19lc3AiKSkgJT4lDQogIGZpbHRlcihhZ2VfYmVuICE9ICJub19lc3AiKSAlPiUgDQogIGdyb3VwX2J5KGFnZV9iZW4pICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpb3MgPSBzdW0oYmVuZWZpY2lhcmlvcykpDQoNCmdncGxvdChkYXRhID0gYWdlX3VfYmVuLCBhZXMoeCA9IGZjdF9yZW9yZGVyKGFnZV9iZW4sIG9yZHZlYyksIHkgPSBiZW5lZmljaWFyaW9zKSkgKw0KICBnZW9tX2NvbChmaWxsID0gImNvcm5mbG93ZXJibHVlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gc2NhbGVzOjpjb21tYShiZW5lZmljaWFyaW9zKSksIHZqdXN0ID0gLTAuMjUsIHNpemUgPSA0KSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIHNlcCA9ICIiKSkgKw0KICB4bGFiKCJHcnVwb3MgcG9yIEVkYWQiKSArIHlsYWIoIkJlbmVmaWNpYXJpb3MiKSArDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiMjIEJlbmVmaWNpYXJpZXMgYnkgYWdlIGNvbXBhcmVkIHRvIDIwMTcgRW5yb2xtZW50DQoNCmBgYHtyIFJFRiBtYXRyaWMgYmVuIH0NCm1hdHJpY19iZW4gPC0gY2VuX3JlZiAlPiUgDQogIHNlbGVjdChtYXRyaWN1bGFfMjAxN19lZHVjYWNpb25faW5pY2lhbCwgbWF0cmljdWxhXzIwMTdfZWR1Y2FjaW9uX3ByaW1hcmlhLCANCiAgICAgICAgIG1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9tZWRpYSkgJT4lDQogIHJlbmFtZSgiMy02IiA9IG1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9pbmljaWFsLA0KICAgICAgICAgIjctMTIiID0gbWF0cmljdWxhXzIwMTdfZWR1Y2FjaW9uX3ByaW1hcmlhLA0KICAgICAgICAgIjEyLTE3IiA9IG1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9tZWRpYSkgJT4lIA0KICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJhZ2VfYmVuIiwgdmFsdWVzX3RvID0gIm1hdHJpY3VsYTIwMTciLCANCiAgICAgICAgICAgICAgIHZhbHVlc19kcm9wX25hID0gVFJVRSkgJT4lIA0KICBncm91cF9ieShhZ2VfYmVuKSAlPiUgDQogIHN1bW1hcmlzZShtYXRyaWN1bGEyMDE3ID0gc3VtKG1hdHJpY3VsYTIwMTcpKSAlPiUNCiAgbGVmdF9qb2luKGFnZV91X2JlbikgJT4lIA0KICBtdXRhdGUocGVyY2VudF90b3RhbCA9IGJlbmVmaWNpYXJpb3MvbWF0cmljdWxhMjAxNyAqIDEwMCkgJT4lIA0KICByZWxvY2F0ZShiZW5lZmljaWFyaW9zLCAuYWZ0ZXIgPSBhZ2VfYmVuKSAlPiUgDQogIHJlbmFtZShgRWRhZCBncnVwb2AgPSBhZ2VfYmVuKSAlPiUgDQogIHNsaWNlKDIsMywxKSAgIyByZWFycmFuZ2luZyByb3dzDQogIA0KYGBgDQoNCj4gV2l0aCByZWZlcmVuY2UgdG8gdGhlIDIwMTcgTWF0cmljdWxhIGRhdGFzZXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgRWR1Y2F0aW9uIHByb2dyYW1tZSBoYXMgcmVhY2hlZCBhbiBvdmVyYWxsIGF2ZXJhZ2Ugb2YgX19gciByb3VuZChzdW0obWF0cmljX2JlbiRiZW5lZmljaWFyaW9zKS8oc3VtKG1hdHJpY19iZW4kbWF0cmljdWxhMjAxNykpKjEwMClgJV9fIG9mIHNjaG9vbGdvaW5nIGNoaWxkcmVuIGFnZWQgMy0xNyBuYXRpb253aWRlLiBDaGlsZHJlbiBhZ2VkIDMtMTcgY29uc2l0dXRlIF9fYHIgcm91bmQoc3VtKG1hdHJpY19iZW4kYmVuZWZpY2lhcmlvcykvKHN1bSh1X2JlbjIkYmVuZWZpY2lhcmlvcykpKjEwMClgJV9fIG9mIGFsbCBVTklDRUYgYmVuZWZpY2lhcmllcy4gDQoNCmBgYHtyIFRBQkxFIG1hdHJpYyBiZW59DQoNCnBhbmRlcihtYXRyaWNfYmVuLCBiaWcubWFyayA9ICIsIiwgc3R5bGUgPSAicm1hcmtkb3duIikNCg0KYGBgDQoNCg0KJm5ic3A7DQombmJzcDsNCg0KIyBDaGFuZ2VzIHNpbmNlIHByZXZpb3VzIG1vbnRoDQoNCmBgYHtyIFJFRiBjdW11bGF0aXZlIGRhdGFzZXRzfQ0KY3VtX3VfYmVuIDwtIHVfYmVuMiAlPiUgDQogIG11dGF0ZShtZXNfc29sbyA9IGFzLkRhdGUobWVzX3NvbG8pKSAlPiUgDQogIGFycmFuZ2UobWVzX3NvbG8pICU+JSANCiAgZ3JvdXBfYnkobWVzX3NvbG8pICU+JSANCiAgc3VtbWFyaXNlKHN1bV9iZW4gPSBzdW0oYmVuZWZpY2lhcmlvcykpICU+JSANCiAgbXV0YXRlKGN1bXVsYXRpdmUgPSBjdW1zdW0oc3VtX2JlbikpDQoNCmN1bV9hY3RfYmVuIDwtIGFjdF9iZW4yICU+JSANCiAgbXV0YXRlKG1lc19zb2xvID0gYXMuRGF0ZShtZXNfc29sbykpICU+JSANCiAgYXJyYW5nZShtZXNfc29sbykgJT4lIA0KICBncm91cF9ieShtZXNfc29sbykgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2JlbiA9IHN1bShiZW5lZmljaWFyaW9zKSkgJT4lIA0KICBtdXRhdGUoY3VtdWxhdGl2ZSA9IGN1bXN1bShzdW1fYmVuKSkNCg0KYGBgDQoNCj4gVGhlIG51bWJlciBvZiBpbmRpdmlkdWFscyByZWFjaGVkIGhhcyBpbmNyZWFzZWQgYnkgX19gciBmb3JtYXQoY3VtX3VfYmVuWzExLDNdIC0gY3VtX3VfYmVuWzEwLDNdLCBiaWcubWFyayA9ICIsIilgX18gaW4gdGhlIHBhc3QgbW9udGgsIHJlYWNoaW5nIGEgdG90YWwgb2YgX19gciBmb3JtYXQocm91bmQoc3VtKHVfYmVuMiRiZW5lZmljaWFyaW9zKSksIGJpZy5tYXJrID0gIiwiKWBfXy4gVGhlIG51bWJlciBvZiBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWFjaGVkIGhhcyBpbmNyZWFzZWQgYnkgX19gciBmb3JtYXQoY3VtX2FjdF9iZW5bMTEsM10gLSBjdW1fYWN0X2JlblsxMCwzXSwgYmlnLm1hcmsgPSAiLCIpYF9fIGluIHRoZSBzYW1lIHBlcmlvZCwgcmVhY2hpbmcgYSB0b3RhbCBvZiBfX2ByIGZvcm1hdChzdW0oY3VtX2FjdF9iZW5bMTEsM10pLCBiaWcubWFyayA9ICIsIilgX18uDQoNCmBgYHtyICBjdW11bGF0aXZlIGJlbmVmaWNpYXJpZXMgbGluZSBQTE9UfQ0KdV9iZW4yICU+JSANCiAgbXV0YXRlKG1lc19zb2xvID0gYXMuRGF0ZShtZXNfc29sbykpICU+JSANCiAgYXJyYW5nZShtZXNfc29sbykgJT4lIA0KICBncm91cF9ieShtZXNfc29sbykgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2JlbiA9IHN1bShiZW5lZmljaWFyaW9zKSkgJT4lIA0KICBtdXRhdGUoY3VtdWxhdGl2ZSA9IGN1bXN1bShzdW1fYmVuKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZXNfc29sbywgeSA9IGN1bXVsYXRpdmUpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6Y29tbWEoY3VtdWxhdGl2ZSkpLCB2anVzdCA9IC0wLjI1LCBoanVzdCA9IDEsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYi0lWSIsIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnVuaXRfZm9ybWF0KHVuaXQgPSAiSyIsIHNjYWxlID0gMWUtMywgc2VwID0gIiIpLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsOTUwMDAwLCBieSA9IDIwMDAwMCkpICsgIyB3aGF0IGlzIHRoaXMgYnJlYWtzIGRvaW5nPw0KICB4bGFiKCJNZXMgUmVwb3J0YWRvIikgKyB5bGFiKCJCZW5lZmljaWFyaW9zIChjdW11bGF0aXZvKSIpDQpgYGANCg0KJm5ic3A7DQoNCiMjIFByb2dyZXNzIGJ5IGFjdGl2aXR5IGJ5IG1vbnRoDQoqbW91c2Ugb3ZlciB0byBzZWUgZGV0YWlscyoNCg0KPiBQcm9ncmVzcyBpbiByZWNlbnQgbW9udGhzIGhhcyBsYXJnZWx5IGJlZW4gZHVlIHRvIHRoZSBkaXN0cmlidXRpb24gb2YgZWR1Y2F0aW9uIGtpdHMgYW5kIGRpc3RhbmNlIGxlYXJuaW5nLiANCg0KYGBge3IgbGluZSBQTE9UIHByb2dyZXNzIGJ5IGFjdGl2aXR5fQ0KYWN0X2xpbmVzIDwtIGFjdF9iZW4yICU+JSANCiAgbXV0YXRlKG1lc19zb2xvID0gYXMuRGF0ZShtZXNfc29sbykpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpZGFkX3Nob3J0LCBtZXNfc29sbykgJT4lIA0KICBzdW1tYXJpc2UoY3VtdWxhdGl2ZSA9IHN1bShiZW5lZmljaWFyaW9zKSkgJT4lIA0KICBtdXRhdGUoY3VtdWxhdGl2ZSA9IHJvdW5kKGN1bXN1bShjdW11bGF0aXZlKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbWVzX3NvbG8sIHkgPSBjdW11bGF0aXZlLCBjb2xvdXIgPSBhY3RpdmlkYWRfc2hvcnQpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMC43KSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICIlYi0lWSIsIGRhdGVfYnJlYWtzID0gIjEgbW9udGgiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIHNlcCA9ICIiKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDUwMDAwMCkpICsNCiAgeGxhYigiIikgKyB5bGFiKCJCZW5lZmljaWFyaW9zIikgKw0KICBzY2FsZV9jb2xvdXJfZGlzY3JldGUobmFtZSA9ICJBY3RpdmlkYWQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpICsNCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIsIGJ5cm93ID0gVFJVRSkpDQoNCmdncGxvdGx5KGFjdF9saW5lcywgdG9vbHRpcCA9IGMoIngiLCAieSIsICJjb2xvdXIiKSkgJT4lIA0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpDQpgYGANCg0KJm5ic3A7DQombmJzcDsNCg0KDQojIFN1bW1hcmllcyBieSBnZW9ncmFwaHkNCg0KIyMgQmVuZWZpY2lhcmllcyBieSBzdGF0ZQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnVfYmVuMiAlPiUgDQogIGdyb3VwX2J5KGVzdGFkbykgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmlvcyA9IHN1bShiZW5lZmljaWFyaW9zKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZW9yZGVyKGVzdGFkbywgYmVuZWZpY2lhcmlvcywgLmRlc2MgPSBUUlVFKSwgDQogICAgICAgICAgICAgeSA9IGJlbmVmaWNpYXJpb3MpKSArDQogIGdlb21fY29sKGZpbGwgPSAiY29ybmZsb3dlcmJsdWUiKSArDQogIHlsaW0oMCwgODUwMDAwKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OmNvbW1hKGJlbmVmaWNpYXJpb3MsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMjUsIGhqdXN0ID0gMC4wNSwgc2l6ZSA9IDMsIGFuZ2xlID0gMzApICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHVuaXRfZm9ybWF0KHVuaXQgPSAiSyIsIHNjYWxlID0gMWUtMywgc2VwID0gIiIpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgMjAwMDAwKSkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkJlbmVmaWNpYXJpb3MiKSArIA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCiZuYnNwOw0KDQpgYGB7ciBSRUYgZm9yIHViaWNhY2lvbiB0ZXh0fQ0KbWlyYV96dWwgPC0gdV9iZW4yICU+JSBmaWx0ZXIoZXN0YWRvID09ICJNSVJBTkRBIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0YWRvID09ICJaVUxJQSIpDQpgYGANCg0KIyMgTnVtYmVyIG9mIFNjaG9vbHMgYnkgU3RhdGUNCj4gQSB0b3RhbCBvZiBfX2ByIGZvcm1hdChuX2Rpc3RpbmN0KHVfYmVuMiR1YmljYWNpb24pLCBiaWcubWFyayA9ICIsIilgX18gc2Nob29scyBoYXZlIGJlZW4gcmVhY2hlZCBieSBVTklDRUY7IF9fYHIgcm91bmQoKG5fZGlzdGluY3QobWlyYV96dWwkdWJpY2FjaW9uKSkgLyAobl9kaXN0aW5jdCh1X2JlbjIkdWJpY2FjaW9uKSkgKiAxMDApYCVfXyBhcmUgZnJvbSBNaXJhbmRhIGFuZCBadWxpYSBhbG9uZS4gDQoNCmBgYHtyIFBMT1Qgb2YgdWJpY2FjaW9uIGJ5IHN0YXRlfQ0KdV9iZW4yICU+JSANCiAgZ3JvdXBfYnkoZXN0YWRvKSAlPiUgDQogIGRpc3RpbmN0KHViaWNhY2lvbikgJT4lIA0KICBzdW1tYXJpc2UodWJpY2FjaW9uID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZW9yZGVyKGVzdGFkbywgdWJpY2FjaW9uLCAuZGVzYyA9IFRSVUUpLCB5ID0gdWJpY2FjaW9uKSkgKw0KICBnZW9tX2NvbChmaWxsID0gImNvcm5mbG93ZXJibHVlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodWJpY2FjaW9uKSksIHZqdXN0ID0gLTAuMjUsIHNpemUgPSAzKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIk51bWVybyBkZSBFc2N1ZWxhcyIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCg0KYGBgDQoNCiZuYnNwOw0KDQpgYGB7ciBSRUYgZm9yIGFsbF9tdW59DQoNCiMgYWxsX211biBpcyBvbmUgb2JzIHBlciBwY29kZTINCmFsbF9tdW4gPC0gdV9iZW4yICU+JSANCiAgbXV0YXRlKGlzX21hdHJpYyA9IGNhc2Vfd2hlbiggIyBmb3IgYmVuZWZpY2lhcmllcyBhZ2VkIDMtMTcNCiAgICAgICAgc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCIzXzYkIikgfiAibWF0cmljIiwNCiAgICAgICAgc3RyX2RldGVjdChkZXNhZ3JlZ2FjaW9uLCI3XzEyJCIpIH4gIm1hdHJpYyIsDQogICAgICAgIHN0cl9kZXRlY3QoZGVzYWdyZWdhY2lvbiwiMTJfMTckIikgfiAibWF0cmljIiwNCiAgICAgICAgVFJVRSB+ICJub25fbWF0cmljIikpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJpb3NfM18xNyA9IGlmZWxzZShpc19tYXRyaWMgPT0gIm1hdHJpYyIsIGJlbmVmaWNpYXJpb3MsIDApKSAlPiUgDQogIGdyb3VwX2J5KGVzdGFkbywgbXVuaWNpcGlvLCBwY29kZTIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpb3MgPSByb3VuZChzdW0oYmVuZWZpY2lhcmlvcykpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmlvc18zXzE3ID0gcm91bmQoc3VtKGJlbmVmaWNpYXJpb3NfM18xNykpKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbGVmdF9qb2luKGFjdF9iZW4gJT4lICMgYnJpbmdpbmcgYWN0aXZpdHkgY291bnRzIGludG8gdV9iZW4NCiAgICAgICAgICAgIGdyb3VwX2J5KHBjb2RlMikgJT4lIA0KICAgICAgICAgICAgc3VtbWFyaXNlKGFjdF90eXBlcyA9IG5fZGlzdGluY3QoYWN0aXZpZGFkX2NvZGlnbykpKSAlPiUgDQogIHJpZ2h0X2pvaW4oY2VuX3JlZiAlPiUgIyBmb3IgYnJpbmdpbmcgbWF0cmljdWxhMjAxNyBpbnRvIGFsbF9tdW4NCiAgICAgICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gYygibWF0cmljdWxhXzIwMTdfZWR1Y2FjaW9uX2luaWNpYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9wcmltYXJpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdHJpY3VsYV8yMDE3X2VkdWNhY2lvbl9tZWRpYSIpLCANCiAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImFnZV9iZW4iLCB2YWx1ZXNfdG8gPSAibWF0cmljdWxhMjAxNyIsIA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogICAgICAgICAgICBzZWxlY3QocGNvZGUyLCBhZ2VfYmVuLCBtYXRyaWN1bGEyMDE3KSAlPiUgDQogICAgICAgICAgICBncm91cF9ieShwY29kZTIpICU+JSANCiAgICAgICAgICAgIHN1bW1hcmlzZShtYXRyaWN1bGEyMDE3ID0gc3VtKG1hdHJpY3VsYTIwMTcpKSkgJT4lIA0KICBtdXRhdGUoY292ZXJhZ2VfcGVyY2VudCA9IHJvdW5kKGJlbmVmaWNpYXJpb3NfM18xNyAvIG1hdHJpY3VsYTIwMTcgKiAxMDApKSAlPiUgDQogIG11dGF0ZShlc3RhZG8gPSBmY3RfcmVvcmRlcihlc3RhZG8sIGJlbmVmaWNpYXJpb3MsIC5kZXNjID0gVFJVRSkpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpb3MpKQ0KDQpgYGANCg0KIyMgU2NhdHRlcnBsb3Qgb2YgTXVuaWNpcGFsaXRpZXMNCipsb2dhcml0aG1pYyBzY2FsZTsgbGFyZ2VyIHBvaW50cyBpbmRpY2F0ZSBtb3JlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgZGFya2VyIGJsdWVzIGluZGljYXRlIG1vcmUgYWN0aXZpdHkgdHlwZXMqIA0KDQoqbW91c2Ugb3ZlciBtdW5pY2lwYWxpdGllcyB0byBzZWUgYmVuZWZpY2lhcmllcyBhbmQgZGlzdGluY3QgYWN0aXZpdGllcyoNCg0KPiBBIHRvdGFsIG9mIF9fYHIgbl9kaXN0aW5jdCh1X2JlbjIkcGNvZGUyKWBfXyBtdW5pY2lwYWxpdGllcyB3ZXJlIHJlYWNoZWQgYnkgdGhlIFVOSUNFRiBFZHVjYXRpb24gcHJvZ3JhbW1lLg0KDQpgYGB7ciBzY2F0dGVyUExPVCBvZiBtdW5pY2lwYWxpdGllcyBieSBzdGF0ZX0NCg0KYWxsX211bl9wb2ludHMgPC0gYWxsX211biAlPiUgDQogIGdncGxvdChhZXModGV4dCA9IG11bmljaXBpbywgeCA9IGVzdGFkbywgeSA9IGJlbmVmaWNpYXJpb3MsIA0KICAgICAgICAgICAgIGNvbG91ciA9IGFjdF90eXBlcykpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpb3MpLCBhbHBoYSA9IDAuOSkgKw0KICBzY2FsZV9jb2xvdXJfZ3JhZGllbnQobG93ID0gImF6dXJlNCIsIGhpZ2ggPSAiZGFya2JsdWUiKSArDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsNCiAgeGxhYigiIikgKyB5bGFiKCJCZW5lZmljaWFyaW9zIEFsY2FuemFkb3MgcG9yIE11bmljaXBpbyIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIA0KDQpnZ3Bsb3RseShhbGxfbXVuX3BvaW50cywgdG9vbHRpcCA9IGMoInRleHQiLCAieSIsICJjb2xvdXIiKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkNCg0KYGBgDQoNCiZuYnNwOw0KDQojIyBUb3AgMTAgbXVuaWNpcGFsaXRpZXMgYnkgcmVhY2ggYW5kIGNvdmVyYWdlDQoNCmBgYHtyIG11bmljaXBhbGl0aWVzIHRvcCBUQUJMRX0NCiMgdG9wIG11bmljaXBhbGl0aWVzIHRhYmxlDQp0b3BfbXVuIDwtIGFsbF9tdW4gJT4lIHNlbGVjdChlc3RhZG8sIG11bmljaXBpbywgYmVuZWZpY2lhcmlvcykgJT4lIHNsaWNlKDE6MTApDQoNCiMgdHJ5IHRvIG1ha2UgYSB0YWJsZSBvZiB0aGUgbW9zdCBvdmVyc3Vic2NyaWJlZCBtdW5pY2lwYWxpdGllcw0KdG9wX2NvdiA8LSBhbGxfbXVuICU+JSBhcnJhbmdlKGRlc2MoY292ZXJhZ2VfcGVyY2VudCkpICU+JSANCiAgc2VsZWN0KGVzdGFkbywgbXVuaWNpcGlvLCBjb3ZlcmFnZV9wZXJjZW50KSAlPiUgc2xpY2UoMToxMCkNCg0KIyB0d28gdGFibGVzIHNpZGUgYnkgc2lkZQ0Ka2FibGUodG9wX211biwgY2FwdGlvbiA9ICJieSBiZW5lZmljaWFyaWVzIikgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAiYm9yZGVyZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImZsb2F0X2xlZnQiKQ0Ka2FibGUodG9wX2NvdiwgY2FwdGlvbiA9ICJieSBjb3ZlcmFnZSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gImJvcmRlcmVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgDQoNCiMgc3VtIG9mIHRvcCB0ZW4NCnRvcF9tdW5fc3VtIDwtIGFsbF9tdW4gJT4lIA0KICBzbGljZSgxOjEwKSAlPiUgc3VtbWFyaXNlKHN1bSA9IHN1bShiZW5lZmljaWFyaW9zLCBuYS5ybSA9IFRSVUUpKQ0KDQphbGxfbXVuX3N1bSA8LSBhbGxfbXVuICU+JSANCiAgc3VtbWFyaXNlKHN1bSA9IHN1bShiZW5lZmljaWFyaW9zLCBuYS5ybSA9IFRSVUUpKQ0KDQpgYGANCg0KPiBUb2dldGhlciwgdGhlIDEwIG11bmljaXBhbGl0aWVzIHdpdGggdGhlIGhpZ2hlc3QgcmVhY2ggKGFib3ZlIGxlZnQpIGZvcm0gX19gciByb3VuZCh0b3BfbXVuX3N1bSAvIGFsbF9tdW5fc3VtICogMTAwKWAlX18gb2YgdGhlIF9fYHIgZm9ybWF0KHN1bShhbGxfbXVuJGJlbmVmaWNpYXJpb3MsIG5hLnJtID0gVFJVRSksIGJpZy5tYXJrID0gIiwiKWBfXyBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIFRoZSBhdmVyYWdlIGNvdmVyYWdlIG9mIHRoZSBzY2hvb2wtYWdlIHBvcHVsYXRpb24gaW4gdGhlIG11bmljaXBhbGl0aWVzIHdoZXJlIFVOSUNFRiBpcyBwcmVzZW50IGlzIF9fYHIgcm91bmQobWVhbihhbGxfbXVuJGNvdmVyYWdlX3BlcmNlbnQsIG5hLnJtID0gVFJVRSkpYCVfXy4gQ292ZXJhZ2UgcmVmZXJzIHRvIHRoZSBwZXJjZW50YWdlIG9mIGVucm9sbGVkIGNoaWxkcmVuIChhZ2VkIDMtMTcgeWVhcnMpIHJlYWNoZWQgYnkgVU5JQ0VGLiANCg0KJm5ic3A7DQoNCiMjIEhpc3RvZ3JhbSBvZiBDb3ZlcmFnZQ0KDQo+IEJlbG93IGlzIGEgaGlzdG9ncmFtIG9mIG11bmNpaXBhbGl0aWVzIHdoZXJlIFVOSUNFRiBpcyBwcmVzZW50IHNob3dpbmcgdGhlIGNvdmVyYWdlIG9mIGVucm9sbGVkIGNoaWxkcmVuIChhZ2VkIDMtMTcpLiBPZiBub3RlLCB3ZSBoYXZlIHJlYWNoZWQgMTAlIG9yIGxlc3Mgb2YgdGhlIHBvcHVsYXRpb24gaW4gX19gciBzdW0oYWxsX211biRjb3ZlcmFnZV9wZXJjZW50IDw9IDEwLCBuYS5ybSA9IFRSVUUpYF9fIG91dCBvZiB0aGUgX19gciBuX2Rpc3RpbmN0KHVfYmVuMiRwY29kZTIpYF9fIGluIHdoaWNoIHdlIG9wZXJhdGUuIFRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIF9fYHIgc3VtKGlzLm5hKGFsbF9tdW4kY292ZXJhZ2VfcGVyY2VudCkpYF9fIHdoZXJlIG5vIFVOSUNFRiBFZHVjYXRpb24gYWN0aXZpdGllcyBoYXZlIG9jY3VycmVkLiANCg0KYGBge3IgUExPVCBoaXN0b2dyYW0gb2YgY292ZXJhZ2V9DQphbGxfbXVuICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gY292ZXJhZ2VfcGVyY2VudCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1LCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIikgKw0KICBzdGF0X2JpbihiaW53aWR0aCA9IDUsIGdlb20gPSAidGV4dCIsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIHZqdXN0ID0gLTAuNSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygwLCAxMCwgMjAsIDMwLCA0MCwgNTAsIDYwLCA3MCwgODAsIDkwKSkgKw0KICB5bGFiKCJOdW1iZXIgb2YgbXVuaWNpcGFsaXRpZXMiKSArIHhsYWIoIlBlcmNlbnQgb2YgZW5yb2xsZWQgY2hpbGRyZW4gKDMtMTcpIGNvdmVyZWQiKQ0KDQpgYGANCg0KJm5ic3A7DQombmJzcDsNCg0KIyBSZXBvcnRzIGFib3V0IFBhcnRuZXJzDQoNCiMjIFN1bW1hcnkgYnkgUGFydG5lcg0KDQpgYGB7ciBQTE9UIHN0YWNrZWQgYmFyIHBhcnRuZXJ9DQpzdGFja19hcnIgPC0gYWN0X2JlbjIgJT4lIA0KICBncm91cF9ieShvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKGJlbmVmaWNpYXJpb3MpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpDQoNCm9yZF9zb2MgPC0gYygiVU5JQ0VGIiwgIlNPQ0lPIDEiLCAiU09DSU8gMiIsICJTT0NJTyA0IiwgIlNPQ0lPIDUiLCAiU09DSU8gNyIsICJTT0NJTyA4IiwNCiAgICAgICAgICAgICAiU09DSU8gMyIsICJTT0NJTyAxMCIsICJTT0NJTyA2IikNCg0Kc29jX3N0YWNrIDwtIGFjdF9iZW4yICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpZGFkX3Nob3J0LCBvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpb3MgPSByb3VuZChzdW0oYmVuZWZpY2lhcmlvcykpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gb3JnYW5pemFjaW9uX2ltcGxlbWVudGFkb3JhLCANCiAgICAgICAgICAgICB5ID0gYmVuZWZpY2lhcmlvcykpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBhY3RpdmlkYWRfc2hvcnQpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIHNlcCA9ICIiKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAsIDQwMDAwMCkpICsNCiAgeGxhYigiIikgKyB5bGFiKCJCZW5lZmljaWFyaW9zIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjEsICJjbSIpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKSArDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICJBY3RpdmlkYWQiKSArDQogIGdlb21fdGV4dChkYXRhID0gc3RhY2tfYXJyLCBhZXMoeSA9IHRvdGFsICsgNjAwMCwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKHRvdGFsKSksIA0KICAgICAgICAgICAgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBvcmRfc29jKQ0KDQpnZ3Bsb3RseShzb2Nfc3RhY2ssIHRvb2x0aXAgPSBjKCJ4IiwgImZpbGwiLCAieSIpKSAlPiUgDQogIGxheW91dChsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIjxiPiBvcmdhbml6YWNpb24gPGI+IikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKQ0KDQpgYGANCg0KJm5ic3A7DQoNCiMjIE51bWJlciBvZiBkaWZmZXJlbnQgYWN0aXZpdGllcyBpbXBsZW1lbnRlZCBieSBlYWNoIHBhcnRuZXINCg0KYGBge3IgVEFCTEUgcGFydG5lciBhY3Rpdml0eSBjb3VudH0NCg0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCmFjdF9iZW4gJT4lIA0KICBtdXRhdGUob3JnYW5pemFjaW9uX2ltcGxlbWVudGFkb3JhID0gDQogICAgICAgICAgIHN0cl9yZXBsYWNlX2FsbChvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVOSUNFRiAtIEZvbmRvIGRlIGxhcyBOYWNpb25lcyBVbmlkYXMgcGFyYSBsYSBJbmZhbmNpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5JQ0VGIikpICU+JSANCiAgcmVuYW1lKHBhcnRuZXIgPSBvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEpICU+JSANCiAgZ3JvdXBfYnkocGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UobnVtX2FjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aWRhZF9jb2RpZ28pKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhudW1fYWN0aXZpdGllcykpICU+JSANCiAgdCgpICU+JSANCiAgcGFuZGVyKCkNCg0KYGBgDQoNCiZuYnNwOw0KDQojIyBQYXJ0bmVycycgcHJvZ3Jlc3Mgb3ZlciB0aW1lDQoqbW91c2Ugb3ZlciBmb3IgZGV0YWlscyoNCg0KYGBge3IgbGluZSBQTE9UIHBhcnRuZXJzIHByb2dyZXNzfQ0Kc29jX2xpbmUgPC0gYWN0X2JlbjIgJT4lIA0KICBtdXRhdGUobWVzX3NvbG8gPSBhcy5EYXRlKG1lc19zb2xvKSkgJT4lIA0KICBncm91cF9ieShvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEsIG1lc19zb2xvKSAlPiUgDQogIHN1bW1hcmlzZShjdW11bGF0aXZlID0gcm91bmQoc3VtKGJlbmVmaWNpYXJpb3MpKSkgJT4lIA0KICBtdXRhdGUoY3VtdWxhdGl2ZSA9IGN1bXN1bShjdW11bGF0aXZlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZXNfc29sbywgeSA9IGN1bXVsYXRpdmUsIGNvbG91ciA9IG9yZ2FuaXphY2lvbl9pbXBsZW1lbnRhZG9yYSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjcpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIiViLSVZIiwgZGF0ZV9icmVha3MgPSAiMSBtb250aCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHVuaXRfZm9ybWF0KHVuaXQgPSAiSyIsIHNjYWxlID0gMWUtMywgc2VwID0gIiIpLCANCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwgNDEwMDAwKSkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkJlbmVmaWNpYXJpb3MiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCkpDQoNCmdncGxvdGx5KHNvY19saW5lLCB0b29sdGlwID0gYygieCIsICJ5IiwgImNvbG91ciIpKSAlPiUgDQogIGxheW91dChsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIjxiPiBvcmdhbml6YWNpb24gPGI+IikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQ0KICANCmBgYA0KDQombmJzcDsNCg0KIyMgU3VtbWFyeSB0YWJsZSBhYm91dCBwYXJ0bmVycycgYWNoaWV2ZW1lbnRzDQoNCmBgYHtyIFRBQkxFIHBhcnRuZXJzIHN1bW1hcnl9DQphY3RfYmVuMiAlPiUgDQogIG11dGF0ZShzZXhfYmVuID0gaWZlbHNlKHN0cl9kZXRlY3QoZGVzYWdyZWdhY2lvbiwgIl5tIiksICJtYWxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoZGVzYWdyZWdhY2lvbiwgIl5mIiksICJmZW1hbGUiLCAibm9fZXNwIikpKSAlPiUgDQogIG11dGF0ZShhY3RpdmlkYWQgPSBhY3RpdmlkYWRfZGVzYykgJT4lIA0KICBncm91cF9ieShvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEpICU+JSANCiAgc3VtbWFyaXNlKG1hbGUgPSBzdW0oKGJlbmVmaWNpYXJpb3Nbc2V4X2JlbiA9PSAibWFsZSJdKSksDQogICAgICAgICAgICBmZW1hbGUgPSBzdW0oKGJlbmVmaWNpYXJpb3Nbc2V4X2JlbiA9PSAiZmVtYWxlIl0pKSwNCiAgICAgICAgICAgIHNleF9yYXRpbyA9IHJvdW5kKChtYWxlL2ZlbWFsZSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmlvcyA9IHN1bShiZW5lZmljaWFyaW9zLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50X29mX3RvdGFsID0gcm91bmQoKGJlbmVmaWNpYXJpb3MgLyBzdW0oYmVuZWZpY2lhcmlvcykgKiAxMDApLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWN0X2JlbiAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEgPSANCiAgICAgICAgICAgICAgc3RyX3JlcGxhY2VfYWxsKG9yZ2FuaXphY2lvbl9pbXBsZW1lbnRhZG9yYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVU5JQ0VGIC0gRm9uZG8gZGUgbGFzIE5hY2lvbmVzIFVuaWRhcyBwYXJhIGxhIEluZmFuY2lhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTklDRUYiKSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShvcmdhbml6YWNpb25faW1wbGVtZW50YWRvcmEpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKG11bmljaXBhbGl0aWVzID0gbl9kaXN0aW5jdChwY29kZTIpKSwgDQogICAgIGJ5ID0gIm9yZ2FuaXphY2lvbl9pbXBsZW1lbnRhZG9yYSIpICU+JSANCiAgcmVsb2NhdGUoYmVuZWZpY2lhcmlvcywgLmFmdGVyID0gb3JnYW5pemFjaW9uX2ltcGxlbWVudGFkb3JhKSAlPiUgDQogIHJlbG9jYXRlKHBlcmNlbnRfb2ZfdG90YWwsIC5hZnRlciA9IGJlbmVmaWNpYXJpb3MpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpb3MpKSAlPiUgDQogIHBhbmRlcihiaWcubWFyayA9ICIsIiwgc3R5bGUgPSAicm1hcmtkb3duIikNCmBgYA0KDQoNCiZuYnNwOw0KJm5ic3A7DQoNCiMgTWFwcyBhbmQgcmVmZXJlbmNlIHRhYmxlDQoNCiZuYnNwOw0KDQojIyBNYXBzIGF0IG11bmljaXBhbCBsZXZlbA0KYGBge3IgTUFQUyBtdW5pY2lwYWwgcmVhY2hlZCBhbmQgcGVyY2VudCByZWFjaGVkfQ0KIyBxdWlldCA9IFRSVUUgaXMgdmVyeSBpbXBvcnRhbnQgaGVyZQ0KcGNvZGUyX3NoYXBlIDwtIHN0X3JlYWQoIkM6L1VzZXJzL1NlYW4gTmcvRG9jdW1lbnRzL1IvNVcvdm56X2FkbTJfc2hhcGVmaWxlcy92ZW5fYWRtYm5kYV9hZG0yXzIwMTgwNTAyLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KICByZW5hbWUocGNvZGUxID0gQURNMV9QQ09ERSwNCiAgICAgICAgIHBjb2RlMiA9IEFETTJfUENPREUpDQoNCiMgSSB0aGluayBwbG90bHkncyBzZWxlY3RvciB0b29sIGlzIG5vdCB2ZXJ5IGdvb2QuIG9yIG1heWJlIHRoZSBjb29yZGluYXRlcw0KIyBvZiB0aGUgdmVuX2FkbWJuZGEgZGF0YXNldCBpcyBub3QgdmVyeSBnb29kLCBhdCBsZWFzdCB3aGVuIGl0IGNvbWVzIHRvIGNlbnRyb2lkcy4gDQoNCm11bl9iZW5fcGxvdCA8LSBhbGxfbXVuICU+JSANCiAgcmlnaHRfam9pbihwY29kZTJfc2hhcGUpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdChhZXMoZmlsbCA9IGJlbmVmaWNpYXJpb3MpKSArDQogIGdlb21fc2Yoc2l6ZSA9IDAuMDEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgZ2d0aXRsZSgiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBtdW5pY2lwYWxpdHkiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSB0cmFuc19yZXZlcnNlcigibG9nIiksIGJyZWFrcyA9IGMoMCwgMTAwLCAxMDAwLCAxMDAwMCwgODA0ODIpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCBuYS52YWx1ZSA9ICJncmF5OTAiKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4zLCAiY20iKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjksIDAuMSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KDQoNCm11bl9wZXJjZW50X3Bsb3QgPC0gYWxsX211biAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUyX3NoYXBlKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lDQogIGdncGxvdChhZXMoZmlsbCA9IGNvdmVyYWdlX3BlcmNlbnQpKSsNCiAgZ2VvbV9zZihzaXplID0gMC4wMSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICBnZ3RpdGxlKCJQZXJjZW50IG9mIGVucm9sbGVkIGNoaWxkcmVuICgzLTE3KSByZWFjaGVkIGJ5IG11bmljaXBhbGl0eSIpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsYWJlbHMgPSBjb21tYSwgdHJhbnMgPSAicmV2ZXJzZSIsIG5hLnZhbHVlID0gImdyYXk5MCIpKw0KICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuMywgImNtIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45LCAwLjEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCiMgdXNpbmcgcGF0Y2h3b3JrIHRvIHB1dCB0aGVtIHNpZGUgYnkgc2lkZSANCg0KbXVuX2Jlbl9wbG90ICsgbXVuX3BlcmNlbnRfcGxvdCArIHBsb3RfbGF5b3V0KG5jb2wgPSAyKQ0KDQpgYGANCg0KJm5ic3A7DQombmJzcDsNCg0KIyMgUmVmZXJlbmNlIHRhYmxlIC0gbXVuaWNpcGFsIGxldmVsDQoNCl9fdXNlIGBVTklDRUZfcHJlc2VudGAgdG8gZmlsdGVyIHRvIG11bmljaXBhbGl0aWVzIHdoZXJlIHRoZSBFZHVjYXRpb24gcHJvZ3JhbW1lIG9wZXJhdGVzX18NCg0KKkNBMDEuMDUgUHJvbW9jaW9uIGRlIG1lbnNhamVzIGNsYXZlcyBwYXJhIGxhIGNvbXVuaWRhZCBlc2NvbGFyIGlzIG5vdCBpbmNsdWRlZCoNCg0KYGBge3IgRFQgZGF0YXRhYmxlfQ0KIyBpdCBzaG93cyAzMzUsIHNob3VsZG4ndCB0aGVyZSBiZSAzMzY/IEkgYmV0IGl0J3MgVmFyZ2FzIGFnYWluDQphbGxfbXVuICU+JSANCiAgbXV0YXRlKFVOSUNFRl9wcmVzZW50ID0gaWZlbHNlKGlzLm5hKGJlbmVmaWNpYXJpb3MpLCBGQUxTRSwgVFJVRSkpICU+JSANCiAgcmVuYW1lKG5vX29mX2FjdGl2aXRpZXMgPSBhY3RfdHlwZXMpICU+JSAjIEkgZmVlbCBsaWtlIHlvdSBzaG91bGQgaGF2ZSBkb25lIHRoaXMgZWFybGllcg0KICBsZWZ0X2pvaW4oY2VuX3JlZiAlPiUgIyBhZGRpdGlvbmFsIGNlbnN1cyB2YXJpYWJsZXMNCiAgICAgIGdyb3VwX2J5KHBjb2RlMikgJT4lIA0KICAgICAgc3VtbWFyaXNlKHBvb3JfcGVyc29ucyA9IHJvdW5kKHN1bShoYW1fMjAxOV94eF9wb2JsYWNpb25fcG9icmVfcG9yX3BhcnJvcXVpYSkpLA0KICAgICAgICAgICAgICAgIHRvdGFsX3BvcCAgICA9IHN1bSh4XzIwMTlfcG9ibGFjaW9uX3BhcnJvcXVpYWxfdG90YWwpKSAlPiUgDQogICAgICBtdXRhdGUocG92ZXJ0eV9pbmNpZGVuY2UgPSByb3VuZChwb29yX3BlcnNvbnMgLyB0b3RhbF9wb3AgKiAxMDApKSkgJT4lIA0KICBzZWxlY3QoIXBjb2RlMikgJT4lDQogIHJlbG9jYXRlKFVOSUNFRl9wcmVzZW50KSAlPiUgDQogIHJlbG9jYXRlKHBvdmVydHlfaW5jaWRlbmNlLCAuYWZ0ZXIgPSBjb3ZlcmFnZV9wZXJjZW50KSAlPiUgDQogIHJlbG9jYXRlKG5vX29mX2FjdGl2aXRpZXMsIC5hZnRlciA9IHBvdmVydHlfaW5jaWRlbmNlKSAlPiUNCiAgZGF0YXRhYmxlKGZpbHRlciA9ICJ0b3AiLCBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSkNCiAgDQpgYGANCg0KDQo=